import PubSub from '../../utils/pubsub';
import moment from '../../utils/moment';

import request from '../../common/request';
import {wlq} from '../../common/config';


const token = wx.getStorageSync("cookie");
let app = null;
// 要全局定义才行

let sockTask = null;

Page({
  data: {
    heightView: 0,
    inputText: "",
    // 总的历史长度
    list: [],

    // 定位到的位置
    scroll_list:[],

    // 键盘的高度
    bottom: 0,
    userId:0,
    // 下拉刷新
    isTriggered: true,
    avatarUrl: "",
    nickName: "",
    myAvatarUrl: wx.getStorageSync("userInfo").avatarUrl,
    myId:wx.getStorageSync("userId"),
    //指定一条的聊天记录
    chatId: '',

    // 需要传给wxs的现在系统的时间
    nt:moment().format(),

    // 加载历史记录的页数
    page:1,

    // 是否停止下拉
    stop:true,


    // 点击发送消息
    sendMessage:false

  },

  // 聚焦
  handleFocus(e) {
    console.log(e.detail.height);
    this.setData({
      bottom: e.detail.height,
    });
  },
  // 失去焦点
  handleBlur(e) {
    // console.log(e.detail);
    this.setData({
      bottom: 0,
    });
  },

  // 处理输入框
  handleInput(e) {
    this.setData({
      inputText: e.detail.value,
    });
  },

  // 处理发送
  handlePublish() {
    const that =this;
    let { inputText, list,userId,myId,nickName,avatarUrl} = this.data;

    // 插入聊天的信息
    let chatInfo = {
      fromId: myId,
      isVisited:0,
      userId:Number(userId),
      content: inputText,
      createTime: moment().format(),
      nickName,
      avatarUrl
    };

    // console.log('聊天数据',list)
    list.push(chatInfo);


    // 发送文字聊天
    sockTask.send({
      data: JSON.stringify({
        content: inputText,
        access_token: token,
        type: 2,
        fromId: myId,
        toId:userId
      }),
      success: function (res) {
        that.setData({
          list,
          inputText: "",
          sendMessage:true
        });
        console.log("发送成功",res);
        // 发送成功，需要判断是否需要在聊天列表中新增加一条数据
        console.log('历史记录的条数',list)
        // 需要新增的 我私聊别人&&没有在聊天列表中;别人私聊我，之前没有聊过天
        if(list.length===1){
          // 当只有一条数据的时候，表示是新聊天
          app.globalData.chatList.unshift(chatInfo);
        }else{
          // 自己发信息要更新聊天列表顺序
          that.upDateChatListOrder(chatInfo)
        }
        // 需要更新聊天列表顺序：收到新的消息、自己发消息、创建一条新的聊天窗口
      },
      fail:function(res){
        console.log('对话消息发送失败',res);

        // 当小程序小框之后，会出现断开连接的现象
      }
    });
  },


  // 更新聊天列表的顺序
  upDateChatListOrder(chatInfo){
    // 根据时间的早晚进行排序
    let chatList = app.globalData.chatList;

    const index = chatList.findIndex(item=>item.userId===chatInfo.userId);

    // 替换为最新的评论
    chatList.splice(index,1,chatInfo);

    // 更新列表顺序
    chatList.map(item=>{
      item['time'] = (new Date(item.createTime)).getTime()
    })

    // 排序
    chatList.sort((a,b)=>b.time-a.time);

    // 重新赋值
    app.globalData.chatList = chatList.slice();

    // console.log('排序更新聊天列表',chatList)
  },


  // 处理下拉刷新加载历史数据
  handleRefresher() {
    console.log("下拉加载更多历史数据");
    let {page,stop,userId} = this.data;

    this.setData({
      isTriggered:false,
    });

    if(!stop){
      return;
    }
    page++;

    this.getHistoryChat(userId,page);

    this.setData({
      page,
    })

  },

  // 获取历史聊天记录
  async getHistoryChat(id,page=1) {
    const {myId,list} = this.data;
    const URL = `${wlq}/chat/${id}/${page}?access_token=${token}`;
    
    const res = await request(URL);
    if(res.code!==200){
      console.log('获取聊天记录失败',res);
      return;
    }
    // 修改数据记录状态
    let list_temp = res.data;
    if(list_temp[list_temp.length-1].fromId!==myId){
      this.upDateState();
      // 也要修改聊天列表的状态
      app.globalData.chatList.map(item=>{
        if(item.userId===list_temp[list_temp.length-1].fromId){
          item.isVisited=1;
        }
      })
    }
    if(res.data.length<20){
      this.setData({
        stop:false
      })
    }
    let new_list = [...res.data,...list]
    this.setData({
      scroll_list:res.data,
      list:new_list
    })

  },

  onLoad: function (options) {
    // console.log(options);
    const that = this;
    app = getApp();

    this.setData({
      avatarUrl: options.avatarUrl,
      nickName: options.nickName,
      userId:options.userId
    });

    // 获取历史聊天记录
    this.getHistoryChat(options.userId);

    // 如果没有登录则需要跳转到登录页面
    if (!wx.getStorageSync("isLogin")) {
      wx.showModal({
        title: "提示",
        content: "请先进行登录授权",
        showCancel: false,
        confirmText: "确定",
        confirmColor: "#3CC51F",
        success: (result) => {
          if (result.confirm) {
            wx.switchTab({
              url: "/pages/user/user",
            });
          }
        },
      });
    }

    sockTask = getApp().globalData.sockTask;

    if(sockTask.readyState!==1){
      console.log('webSocket断开了重新连接....')
      getApp().socket()
    }


    // 订阅方
    PubSub.subscribe('dialog',(msg,result)=>{

      console.log('订阅发方',msg,result);

      if(result.code!==200 || result.data.fromId===result.data.toId){
        console.log('错误或者发送接收者一致');
        return;
      }
      
      const contentInfo =result.data;
      let {list} = that.data;
      // 拼接到历史聊天记录中
      list.push(contentInfo);

      // 判断需不需要添加新的聊天好友记录
      const index = app.globalData.chatList.findIndex(item=>item.userId===contentInfo.userId)
      if(index===-1){
        // 表示是新的聊天对象
        app.globalData.chatList.unshift(contentInfo);
      }else{
        // 更新聊天列表顺序
        that.upDateChatListOrder(contentInfo);
      }
      that.setData({
        list,
        chatId:contentInfo.chatId
      })
    })
  },

  // 修改某条记录的状态
  upDateState(){
    const {userId,chatId} = this.data;
    sockTask.send({
      data:JSON.stringify({
        access_token:token,
        type:4,
        toId:userId,
        chatId
      }),
      success(){
        console.log('修改记录状态成功')
      }
    });

  },

  onUnload(){
    // 取消订阅
    PubSub.unsubscribe('dialog');
    // 修改状态
    if(this.data.chatId){
      this.upDateState()
    }
  },

  // 跳转要商家主页
  navToSellerHome(e){
    const dataSet = e.currentTarget.dataset;
    wx.navigateTo({
      url: `/pages/sellerHome/sellerHome?userId=${dataSet.id}&avatarUrl=${dataSet.avatarurl}&nickName=${dataSet.nickname}`,
    });
  }
});
